package com.example.jvm.chapter02;

import java.util.HashMap;
import java.util.Map;

/**
 * @Date 2024-01-05
 * @Author Jonathan
 */
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && name.equals(person.name);
    }

    // 如果重写了 equals 方法，就必须重写 hashCode 方法
    @Override
    public int hashCode() {
        return 31 * name.hashCode() + age;
    }

    public static void main(String[] args) {
        Person person1 = new Person("John", 25);
        Person person2 = new Person("John", 25);

        // 如果没有重写 hashCode 方法，这两个对象的哈希码可能不同
        Map<Person, String> map = new HashMap<>();
        map.put(person1, "Person 1");

        // 如果没有重写 equals 方法，这里可能返回 null，因为默认比较的是对象的引用
        String result = map.get(person2);

        System.out.println(result); // 应该输出 "Person 1"
        System.out.println(person1.equals(person2));
        System.out.println(person1.hashCode());
        System.out.println(person2.hashCode());
    }
}

